package com.sbdev.type.handler;

import com.sbdev.dic.SexEnum;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 性别枚举类型处理器，用于MyBatis中将数据库中的整型数据与SexEnum枚举类型相互转换。
 * 使用@MappedJdbcTypes和@MappedTypes注解分别指定了对应的JDBC类型和Java类型。
 */
@MappedJdbcTypes(JdbcType.INTEGER)
@MappedTypes({SexEnum.class})
public class SexTypeHandler extends BaseTypeHandler<SexEnum> {

    /**
     * 设置非空参数。
     * 将枚举类型SexEnum的id值设置到PreparedStatement中，对应数据库中的整型字段。
     * @param ps      PreparedStatement对象
     * @param idx     参数索引
     * @param sex     性别枚举值
     * @param jdbcType JDBC类型
     * @throws SQLException 如果设置参数时发生错误
     */
    @Override
    public void setNonNullParameter(
            PreparedStatement ps, int idx, SexEnum sex, JdbcType jdbcType) throws SQLException {
        ps.setInt(idx, sex.getId());
    }

    /**
     * 从ResultSet中获取非空结果。
     * 根据列名获取整型值，并将其转换为SexEnum枚举类型。
     * @param rs      ResultSet对象
     * @param columnName 列名
     * @return 性别枚举值
     * @throws SQLException 如果获取结果时发生错误
     */
    @Override
    public SexEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
        Integer id = rs.getInt(columnName);
        return SexEnum.getSexEnum(id);
    }

    /**
     * 从ResultSet中获取非空结果。
     * 根据索引获取整型值，并将其转换为SexEnum枚举类型。
     * @param rs      ResultSet对象
     * @param idx     列索引
     * @return 性别枚举值
     * @throws SQLException 如果获取结果时发生错误
     */
    @Override
    public SexEnum getNullableResult(ResultSet rs, int idx) throws SQLException {
        Integer id = rs.getInt(idx);
        return SexEnum.getSexEnum(id);
    }

    /**
     * 从CallableStatement中获取非空结果。
     * 根据索引获取整型值，并将其转换为SexEnum枚举类型。
     * @param cs      CallableStatement对象
     * @param idx     列索引
     * @return 性别枚举值
     * @throws SQLException 如果获取结果时发生错误
     */
    @Override
    public SexEnum getNullableResult(CallableStatement cs, int idx) throws SQLException {
        Integer id = cs.getInt(idx);
        return SexEnum.getSexEnum(id);
    }
}
